package _0_5_编辑距离

/**
原题链接:
https://leetcode.cn/problems/palindromic-substrings/

647. 回文子串
给你一个字符串 s ，请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串，即使是由相同的字符组成，也会被视作不同的子串。

示例 1：
输入：s = "abc"
输出：3
解释：三个回文子串: "a", "b", "c"

示例 2：
输入：s = "aaa"
输出：6
解释：6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
*/

func countSubstrings(s string) int {

	n := len(s) //获取长度
	res := 0    //声明结果

	dp := make([][]bool, n) //声明dp数组
	for i := 0; i < n; i++ {
		dp[i] = make([]bool, n)
	}

	//填充dp数组
	for i := n - 1; i >= 0; i-- { //从后向前遍历字符串  （起始位置）
		for j := i; j < n; j++ { //j从i下标开始, 遍历到字符串尾部  （结束位置）
			if s[i] == s[j] { //如果i,j位置字符相等, 分类讨论
				if j-i <= 1 { //如果构成字符串长度<=1
					res++
					dp[i][j] = true
				} else if dp[i+1][j-1] { //如果构成长度>=1, 需要判断中间字符串是否为回文子串, 即dp[i+1][j-1]
					res++
					dp[i][j] = true
				}
			}
		}
	}

	return res
}
